<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue.js - 基础</title>
    <style>
        .container {
            width: 800px;
            height: 400px;
            border: 1px solid red;
            margin: 20px auto;
        }
    </style>
</head>

<body>
    <div id="app">
        <!-- 使用组件 -->
        <main-container>
            <!-- 使用具名插槽 来指定自定义的布局内容 -->
            <!-- vue@2.6+ 写法 ,通过v-slot 指令来命名 -->
            <!-- 通过v-slot 来指定模板渲染的具名插槽为header , 插槽作用传递一个参数值,参数名为h (参数是一个对象) -->
            <!-- <template v-slot:header="h">
                <h1>{{h.h}}</h1>
            </template> -->

            <!-- 解构插槽作用域 -->
            <template v-slot:header="{ h }">
                <h1>{{h.header}}</h1>
            </template>
            
            <template v-slot:body="{ h }">
                <h1>{{h.body}}</h1>
            </template>

            <template v-slot:footer="{ h }">
                <h1>{{h.footer}}</h1>
            </template>
        </main-container>
    </div>

    <template id="main-container-tpl">
        <div class="container">
            <!-- 头部内容 -->
            <div class="header">
                <!-- 在具名为header的slot 插槽中 绑定一个属性(传递一个属性 , 属性的名为h , 值为content2.header ) -->
                <slot name="header" :h="content2"></slot>
            </div>
            <!-- 正文内容 -->
            <div class="body">
                <slot name="body" :h="content2"></slot>
            </div>
            <!-- 底部内容 -->
            <div class="footer">
                <slot name="footer" :h="content2"></slot>
            </div>
        </div>
    </template>

    <!-- 引入vue框架 开发版 :包含警告 和调试信息 -->
    <script src="../lib/vue.js"></script>
    <script>
        // 使用具名插槽 v-slot:header 内容模板就会被渲染到 name为 header 的slot 中
        // 其实匿名插槽 相当于 v-slot:default 默认渲染到没有命名或者name为default的slot中

        Vue.component('MainContainer', {
            props: ['title', 'body', 'footer'],
            data() {
                return {
                    content2: {
                        header: "这是头部 ---> 这是子组件中的数据",
                        body: "这是正文啊啊啊---> 这是子组件中的数据",
                        footer: "这是底部内容---> 这是子组件中的数据"
                    },
                }
            },
            template: '#main-container-tpl'
        })

        //vm 就是根组件
        let vm = new Vue({
            el: "#app",//指定Vue挂载的DOM
            data: {//当前vue实例中使用的数据

            },
            methods: {//当前Vue实例中使用到的方法

            }
        })
    </script>
</body>

</html>